package models

import (
	"context"
	"go.mongodb.org/mongo-driver/bson"
)

// UserRoom 用户-房间关联表
type UserRoom struct {
	UserIdentity string `json:"user_identity" bson:"user_identity"` // 用户ID
	RoomIdentity string `json:"room_identity" bson:"room_identity"` // 房间ID
	RoomType     int    `json:"room_type" bson:"room_type"`         // 房间类型【1-单人房间 2-群聊房间】
	CreatedAt    int64  `json:"created_at" bson:"created_at"`       // 创建时间
	UpdatedAt    int64  `json:"updated_at" bson:"updated_at"`       // 更新时间
}

// CollectionName 返回数据库集合名
func (UserRoom) CollectionName() string {
	return "user_room"
}

// GetUserRoomByUserIdentityRoomIdentity 根据用户ID和房间ID查询用户房间关联关系
func GetUserRoomByUserIdentityRoomIdentity(userIdentity, roomIdentity string) (*UserRoom, error) {
	ur := &UserRoom{} // 创建UserRoom实例

	// 执行MongoDB查询：根据用户ID和房间ID查找唯一记录
	err := Mongo.Collection(UserRoom{}.CollectionName()).
		FindOne(context.Background(), bson.D{
			{"user_identity", userIdentity}, // 用户ID条件
			{"room_identity", roomIdentity}, // 房间ID条件
		}).Decode(ur) // 将查询结果解码到ur结构体

	return ur, err
}

// GetUserRoomByRoomIdentity 根据房间ID查询该房间的所有用户关联记录
func GetUserRoomByRoomIdentity(roomIdentity string) ([]*UserRoom, error) {
	// 根据房间ID查询MongoDB
	cursor, err := Mongo.Collection(UserRoom{}.CollectionName()).Find(context.Background(), bson.D{
		{"room_identity", roomIdentity}, // 查询条件：房间标识
	})
	if err != nil {
		return nil, err // 查询失败返回错误
	}
	var urs []*UserRoom // 创建空切片存储结果

	// 遍历查询结果
	for cursor.Next(context.Background()) {
		ur := &UserRoom{}        // 创建UserRoom实例
		err := cursor.Decode(ur) // 解码数据到结构体
		if err != nil {
			return nil, err // 解码失败返回错误
		}
		urs = append(urs, ur) // 将记录添加到切片
	}
	return urs, nil // 返回查询结果
}

// InsertOneUserRoom 向数据库插入单条用户-房间关联记录
func InsertOneUserRoom(ur *UserRoom) error {
	// 在MongoDB的用户房间集合中插入一条文档记录
	_, err := Mongo.Collection(UserRoom{}.CollectionName()).InsertOne(context.Background(), ur)
	return err // 返回插入操作的错误信息（成功时为nil）
}
